/*
 * 说明：用于项目字典值的使用
 * ljy
 * 20220225最后修改
 * 提示：应该根据前端展示的需求，用好mapToDict和dictToMap两个函数。
 * */
import Request from '@/api/request/request';
import urls from '@/api/request/urls';
import { type DictItem } from '@/types/interface/sys_interface';

export interface Option {
  // 作为字典选项标准
  value: any; // 相当于键，即Key
  label: string; // 相当于标签
}

// 性别选择
// export const userSexMap: Map<number, String> = new Map([[0, '未选择'], [1, '男'], [2, '女']]);

// export const userStatus: Map<number, String> = new Map([[0, '不可用'], [1, '可用'], [2, '锁定']]);

export const userSexDict: Array<Option> = [
  {
    value: 0,
    label: '保密'
  },
  {
    value: 1,
    label: '男'
  },
  {
    value: 2,
    label: '女'
  }
];
export const userStatusDict: Array<Option> = [
  {
    value: 0,
    label: '禁用'
  },
  {
    value: 1,
    label: '可用'
  },
  {
    value: 2,
    label: '锁定'
  }
];
export const yesOrNoDict: Array<Option> = [
  {
    value: true,
    label: '是'
  },
  {
    value: false,
    label: '否'
  }
];
// 权限的菜单类型
export const permissionTypeDict: Array<Option> = [
  {
    value: 1,
    label: '菜单'
  },
  {
    value: 2,
    label: '按钮'
  }
];
// 权限的打开方式
export const permissionLinkTypeDict: Array<Option> = [
  {
    value: 1,
    label: '组件'
  },
  {
    value: 2,
    label: '内链'
  },
  {
    value: 3,
    label: '外链'
  }
];
// positionId职务
export const positionId: Array<Option> = [
  {
    value: 1,
    label: '行政管理人员'
  },
  {
    value: 2,
    label: '专任教师'
  },
  {
    value: 3,
    label: '系部主任'
  },
  {
    value: 4,
    label: '系部书记'
  },
  {
    value: 5,
    label: '系部副主任'
  },
  {
    value: 6,
    label: '系部副书记'
  },
  {
    value: 7,
    label: '辅导员'
  },
  {
    value: 8,
    label: '教秘'
  },
  {
    value: 9,
    label: '行秘'
  },
  {
    value: 10,
    label: '外聘教师'
  },
  {
    value: 11,
    label: '人事部'
  }
];
// =======
// 教室类型 颜卓中添加
export const roomTypeDict: Array<Option> = [
  {
    value: 1,
    label: '机房'
  },
  {
    value: 2,
    label: '多媒体教室'
  },
  {
    value: 3,
    label: '普通教室'
  }
];
// 部门管理所属部门 颜卓中添加
export const sysdepartmentTypeDict: Array<Option> = [
  {
    value: 1,
    label: '柳州城市职业学院'
  },
  {
    value: 2,
    label: '柳铁'
  },
  {
    value: 3,
    label: '柳州职业技术学院'
  }
];
// 教室管理所属部门 颜卓中添加
export const departmentTypeDict: Array<Option> = [
  {
    value: 1,
    label: '信息工程系'
  },
  {
    value: 2,
    label: '经济贸易系'
  },
  {
    value: 6,
    label: '文化旅游系'
  },
  {
    value: 7,
    label: '公共基础部'
  },
  {
    value: 8,
    label: '机电工程系'
  }
];
// >>>>>>> origin/master
export const mapToDict = <K>(map: Map<K, string>): Option[] => {
  // 用于从map转数组，方便用于不同的场合
  const array: Option[] = new Array(map.size);
  let index = 0;
  // es-lint不推荐下面的写法
  // for (let [key, value] of map) {
  //   array[index].value = key;
  //   array[index].label = value;
  //   index += 1;
  // }
  map.forEach((value, key) => {
    array[index].value = key;
    array[index].label = value;
    index += 1;
  });
  return array;
};

export const dictToMap = <K>(array: Option[]): Map<K, string> => {
  // 用于从数组转map，方便用于不同的场合
  const map: Map<K, string> = new Map();
  array.forEach((item: Option) => {
    map.set(item.value, item.label);
  });
  return map;
};

/**
 * 用于从服务端获取字典值
 * @param dictName 字典名称
 * @param dictValueType 字典值的类型，number表示数字，string表示字符串（默认），boolean表示布尔类型。如果不转换则可能在下拉框等无法正常显示
 */
export const getDict = async (dictName: string, dictValueType?: string): Promise<Array<Option>> => {
  const array: Option[] = [];
  let index = 0;
  // 从服务端读取相应名称的字典
  const resData: any = await new Request(`${urls.API_URL_BACKSTAGE_DICTITEM_MANAGE}/all`, null, {
    params: {
      'sysDict.name': dictName
    }
  }).get();
  if (resData.success) {
    const items = resData.data;
    // array = new Array(items.length);
    // 按照规则生成字典
    items.forEach((item: DictItem) => {
      let dictValue: string | number | boolean;
      if (dictValueType === 'number') {
        dictValue = Number(item.dictValue);
      } else if (dictValueType === 'boolean') {
        //如果后端传递过来的是布尔类型或是字符串（例如true以字符串形式传过来）
        if (typeof item.dictValue == 'string') {
          dictValue = item.dictValue == 'true' ? true : false;
          //不能直接用下面的方式转，因为Boolean('false')的结果是true
          // dictValue = Boolean(item.dictValue);
        } else if (typeof item.dictValue == 'boolean') {
          dictValue = Boolean(item.dictValue);
        } else {
          //如果是数字
          //注意这里转换为布尔类型要用Number先包起来，否则会认为里面的数字都是字符串
          dictValue = Boolean(Number(item.dictValue));
        }
      } else {
        dictValue = item.dictValue!;
      }
      array[index] = {
        value: dictValue,
        label: item.dictKey!
      };
      index += 1;
    });
  }
  return array;
};

/*
export default {
  sexOfUserMap
}
*/

// console.log(dictToMap(yesOrNoDict));
